﻿using System;
using System.Data;
using System.Configuration;
using System.Web;
using System.Web.Security;
using System.Web.UI;
using System.Web.UI.WebControls;
using System.Web.UI.WebControls.WebParts;
using System.Web.UI.HtmlControls;
using System.Collections.Generic;
using System.Collections;
using System.ComponentModel;

namespace BaseSet.Entity.Common.ControlOperation
{
    /// <summary>
    /// 控件的数据绑定
    /// </summary>
    public class BindControl
    {
        #region -- 绑定列表控件 已整理 --

        /* 
         * 适用于 DropDownList、CheckBoxList、RadioButtonList等继承ListControl类的控件 
         * 数据源支持 实现接口 IEnumerable（如：Array、List、Dictionary 等） 或 IListSource（如 DataSet、DataTable 等） 的类型
         * 
         */

        /// <summary>
        /// 私有方法 接受任意类型的数据源 如果数据源不合法 这个方法会报错 目前仅将两类合法的数据源 加壳公开
        /// </summary>
        /// <param name="lst">要绑定的下拉列表</param>
        /// <param name="dataSource">数据源</param>
        /// <param name="textField">文本域</param>
        /// <param name="valueField">值域</param>
        /// <param name="defaultText">默认项文本</param>
        /// <param name="defaultValue">默认项值</param>
        private static void bindList(ListControl lst, Object dataSource, string textField, string valueField, string defaultText, string defaultValue)
        {
            lst.Items.Clear();

            lst.DataSource = dataSource;
            if (!string.IsNullOrEmpty(textField))
            {
                lst.DataTextField = textField;
            }
            if (!string.IsNullOrEmpty(valueField))
            {
                lst.DataValueField = valueField;
            }
            lst.DataBind();

            if (!string.IsNullOrEmpty(defaultText) || !string.IsNullOrEmpty(defaultValue))
            {
                ListItem li = new ListItem(defaultText, defaultValue);
                lst.Items.Insert(0, li);
            }
        }

        #region ---- 数据源为实现接口 IEnumerable 的类型

        /// <summary>
        /// 绑定下拉列表 用于绑定数组等只有一个域的数据源 列表项的显示文本与值相同
        /// </summary>
        /// <param name="ddl">要绑定的下拉列表</param>
        /// <param name="dataSource">数据源 任何实现枚举接口（IEnumerable）的类型</param>
        /// <param name="hasDefault">是否包含默认项 true=包含 false=不包含 默认项：Text='-请选择-' Value='-1'</param>
        public static void BindList(ListControl lst, IEnumerable dataSource, bool hasDefault)
        {
            if (hasDefault)
            {
                bindList(lst, dataSource, null, null, "-请选择-", "-1");
            }
            else
            {
                bindList(lst, dataSource, null, null, null, null);
            }
        }

        /// <summary>
        /// 绑定下拉列表 必须指定文本域与值域
        /// </summary>
        /// <param name="ddl">要绑定的下拉列表</param>
        /// <param name="dataSource">数据源 任何实现枚举接口（IEnumerable）的类型</param>
        /// <param name="textField">T类型的属性名 下拉列表项的显示文本</param>
        /// <param name="valueField">T类型的属性名 下拉列表项的值</param>
        /// <param name="hasDefault">是否包含默认项 true=包含 false=不包含 默认项：Text='-请选择-' Value='-1'</param>
        public static void BindList<T>(ListControl lst, IEnumerable<T> dataSource, string textField, string valueField, bool hasDefault)
        {
            if (hasDefault)
            {
                bindList(lst, dataSource, textField, valueField, "-请选择-", "-1");
            }
            else
            {
                bindList(lst, dataSource, textField, valueField, null, null);
            }
        }

        /// <summary>
        /// 绑定下拉列表 指定文本域、值域以及默认项的文本和值
        /// </summary>
        /// <typeparam name="T">源 数据类型</typeparam>
        /// <param name="ddl">要绑定的下拉列表</param>
        /// <param name="dataSource">数据源  任何实现枚举接口（IEnumerable）的类型</param>
        /// <param name="textField">T类型的属性名 下拉列表项的显示文本</param>
        /// <param name="valueField">T类型的属性名 下拉列表项的值</param>
        /// <param name="defaultText">下拉列表默认项的显示文本 如果为空 则不显示默认项</param>
        /// <param name="defaultValue">下拉列表默认项的值 如果为空 则不显示默认项</param>
        public static void BindList<T>(ListControl lst, IEnumerable<T> dataSource, string textField, string valueField, string defaultText, string defaultValue)
        {
            bindList(lst, dataSource, textField, valueField, defaultText, defaultValue);
        }

        #endregion

        #region ---- 数据源为实现接口 IListSource 的类型

        /// <summary>
        /// 绑定下拉列表 只有一列 文本域和值域相同
        /// </summary>
        /// <param name="ddl">要绑定的下拉列表</param>
        /// <param name="dataSource">数据源 实现了IListSource的类型 如DataSet、DataTable</param>
        /// <param name="hasDefault">是否包含默认项 true=包含 false=不包含 默认项：Text='-请选择-' Value='-1'</param>
        public static void BindList(ListControl lst, IListSource dataSource, bool hasDefault)
        {
            if (hasDefault)
            {
                bindList(lst, dataSource, null, null, "-请选择-", "-1");
            }
            else
            {
                bindList(lst, dataSource, null, null, null, null);
            }
        }

        /// <summary>
        /// 绑定下拉列表 必须指定文本域与值域
        /// </summary>
        /// <param name="ddl">要绑定的下拉列表</param>
        /// <param name="dataSource">数据源 实现IListSource的类型 如DataSet、DataTable</param>
        /// <param name="textField">数据源的域名称 下拉列表项的显示文本</param>
        /// <param name="valueField">数据源的域名称 下拉列表项的值</param>
        /// <param name="hasDefault">是否包含默认项 true=包含 false=不包含 默认项：Text='-请选择-' Value='-1'</param>
        public static void BindList(ListControl lst, IListSource dataSource, string textField, string valueField, bool hasDefault)
        {
            if (hasDefault)
            {
                bindList(lst, dataSource, textField, valueField, "-请选择-", "-1");
            }
            else
            {
                bindList(lst, dataSource, textField, valueField, null, null);
            }
        }
        
        /// <summary>
        /// 绑定下拉列表 必须指定文本域与值域
        /// </summary>
        /// <param name="ddl">要绑定的下拉列表</param>
        /// <param name="dataSource">数据源 实现IListSource的类型 如DataSet、DataTable</param>
        /// <param name="textField">数据源的域名称 下拉列表项的显示文本</param>
        /// <param name="valueField">数据源的域名称 下拉列表项的值</param>
        /// <param name="defaultText">下拉列表默认项的显示文本 如果为空 则不显示默认项</param>
        /// <param name="defaultValue">下拉列表默认项的值 如果为空 则不显示默认项</param>
        public static void BindList(ListControl lst, IListSource dataSource, string textField, string valueField, string defaultText, string defaultValue)
        {
            bindList(lst, dataSource, textField, valueField, defaultText, defaultValue);
        }

        #endregion

        #endregion

        #region -- 列表控件操作 已整理--

        /*
         * 列表项的选择可扩展为多选
         */

        /// <summary>
        /// 根据显示文本 选中列表项 只找到第一个
        /// </summary>
        /// <param name="lst">列表</param>
        /// <param name="text">文本</param>
        public static void SelectedItemByText(ListControl lst, string text)
        {
            for (int i = 0; i < lst.Items.Count; i++)
            {
                if (lst.Items[i].Text == text)
                {
                    lst.Items[i].Selected = true;
                        break;
                }
            }
        }

        /// <summary>
        /// 根据值 选中列表项 只找到第一个
        /// </summary>
        /// <param name="lst">列表</param>
        /// <param name="value">值</param>
        public static void SelectedItemByValue(ListControl lst, string value)
        {
            for (int i = 0; i < lst.Items.Count; i++)
            {
                if (lst.Items[i].Value == value)
                {
                    lst.Items[i].Selected = true;
                        break;
                }
            }
        }

        #endregion
    }
}
